package com.novellotus.iov.carvice.retrofit;


import com.novellotus.iov.carvice.bean.AccountBean;
import com.novellotus.iov.carvice.bean.FailureBeen;
import com.novellotus.iov.carvice.bean.IntegralListItemBean;
import com.novellotus.iov.carvice.bean.MapCarListBean;
import com.novellotus.iov.carvice.bean.PersonBean;
import com.novellotus.iov.carvice.bean.PointsBean;
import com.novellotus.iov.carvice.bean.RxCarData;
import com.novellotus.iov.carvice.bean.RxCarListBean;
import com.novellotus.iov.carvice.bean.RxDiagnosisAlarm;
import com.novellotus.iov.carvice.bean.RxDiagnosisChart;
import com.novellotus.iov.carvice.bean.RxDiagnosisListItem;
import com.novellotus.iov.carvice.bean.RxEinfos;
import com.novellotus.iov.carvice.bean.RxEstion;
import com.novellotus.iov.carvice.bean.RxEusers;
import com.novellotus.iov.carvice.bean.RxFaultTypeBean;
import com.novellotus.iov.carvice.bean.RxFindUser;
import com.novellotus.iov.carvice.bean.RxFn;
import com.novellotus.iov.carvice.bean.RxLoginBean;
import com.novellotus.iov.carvice.bean.RxMessageBean;
import com.novellotus.iov.carvice.bean.RxOrder;
import com.novellotus.iov.carvice.bean.RxStorageCar;
import com.novellotus.iov.carvice.bean.RxTaskDetail;
import com.novellotus.iov.carvice.bean.RxTaskListBean;
import com.novellotus.iov.carvice.bean.RxUpdate;
import com.novellotus.iov.carvice.bean.RxVehicle;
import com.novellotus.iov.carvice.bean.RxVehicleDetail;
import com.novellotus.iov.carvice.bean.RxVehiclesType;
import com.novellotus.iov.carvice.bean.WXPayBean;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.HTTP;
import retrofit2.http.Headers;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.Streaming;
import retrofit2.http.Url;

/**
 * Created by Administrator on 2017/8/3
 * 接口管理
 */

public interface RetrofitApi {


    /**
     * 微信支付
     */
    @GET("app_pay.php")
    Call<ResponseBody> wxPay();

    /**
     * 发送短信
     */
    @GET("sms/send/{phone}")
    Observable<BaseEntity<Response>> sendSms(@Path("phone") String phone);

    /**
     * 验证验证码
     */
    @GET("sms/valid/{phone}")
    Observable<BaseEntity<Response>> validSms(@Path("phone") String phone, @Query("code") String code);


    /**
     * 验证手机号
     * 返回true 手机可用（数据库里没有这个号码）
     * 返回false 手机号不可用(数据库已经存在这个号码)
     * 更改手机号验证接口： /valid/mobile?key=手机号&valid_type=update_info&id=用户ID
     * 注册账户手机号验证接口： /valid/mobile?key=手机号&valid_type=insert_info
     * 忘记密码验证手机号接口：/valid/mobile?key=手机号&valid_type=forget_password
     */
    @GET("valid/mobile")
    Observable<BaseEntity<Boolean>> validMobile(@Query("key") String phone, @Query("valid_type") String valid_type);


    /**
     * 注册
     */
    @POST("register")
    Observable<BaseEntity<Boolean>> register(@Body RequestBody requestBody);


    /**
     * 登录
     */
    @FormUrlEncoded
    @POST("login")
    Observable<BaseEntity<RxLoginBean>> login(@Field("username") String username, @Field("password") String password);

    /**
     * 忘记密码
     */
    @FormUrlEncoded
    @POST("forget")
    Observable<BaseEntity<Boolean>> forget(@Field("mobile") String mobile, @Field("checkCode") String checkCode, @Field("password") String password);

    /**
     * 获取个人信息
     */
    @GET("profile")
    Observable<BaseEntity<PersonBean>> profile(@Query("access_token") String access_token);


    /**
     * 修改个人信息
     */
    @FormUrlEncoded
    @POST("profile")
    Observable<BaseEntity<Boolean>> changeProfile(@Field("sign") String sign);

    /**
     * 修改密码
     */
    @FormUrlEncoded
    @POST("profile/password")
    Observable<BaseEntity<Boolean>> changePassword(@Field("sign") String sign);


    /**
     * 修改手机号码
     */
    @FormUrlEncoded
    @POST("profile/mobile")
    Observable<BaseEntity<Boolean>> changeMobile(@Field("sign") String sign);

    /**
     * 关注车辆
     */
    @FormUrlEncoded
    @POST("follow_vehicle")
    Observable<BaseEntity<Object>> followVehicle(@Field("sign") String sign);

    /**
     * 获取关注车辆列表
     */
    @GET("follow_vehicles/page")
    Observable<BaseEntity<RxCarListBean>> followVehicleList(@Query("access_token") String access_token, @Query("current") int current, @Query("size") int size, @Query("searchText") String searchText);

    /**
     * 取消关注车辆
     */
    @DELETE("follow_vehicle/{vin}")
    Observable<BaseEntity<Boolean>> cancelFollowVehicle(@Path("vin") String vin, @Query("access_token") String access_token);

    /**
     * 获取单个车辆的监控数据
     */
    @GET("follow_vehicles/{vin}")
    Observable<BaseEntity<RxCarData>> getVehicleData(@Path("vin") String vin, @Query("access_token") String access_token);

    /**
     * 获取地图车辆数据
     */
    @GET("follow_vehiclesbyrange")
    Observable<BaseArrayEntity<MapCarListBean>> getMapVehicleData(@Query("access_token") String access_token, @Query("startLat") double startLat, @Query("startLng") double startLng, @Query("endLat") double endLat, @Query("endLng") double endLng);

    /**
     * 获取关注的所有车辆
     */
    @GET("all/follow_vehicles")
    Observable<BaseArrayEntity<MapCarListBean>> getAllVehicleData(@Query("access_token") String access_token);


    /**
     * 获取通知消息列表
     */
    @GET("msgnum")
    Observable<BaseEntity<Integer>> getMessageCount(@Query("access_token") String access_token);

    /**
     * 获取通知消息列表
     */
    @GET("msg/query")
    Observable<BaseEntity<RxMessageBean>> getMessage(@Query("access_token") String access_token, @Query("current") int current, @Query("size") int size);

    /**
     * 上报维修
     */
    @FormUrlEncoded
    @POST("serviceform")
    Observable<BaseEntity<Boolean>> addService(@Field("sign") String sign);

    /**
     * 获取故障类型
     */
    @GET("vehicle/malfuncmodel")
    Observable<BaseArrayEntity<RxFaultTypeBean>> getFaultType();

    /**
     * 验证车辆是否可以上报
     */
    @GET("serviceform/check")
    Observable<BaseEntity<Object>> checkCar(@Query("pn") String pn, @Query("access_token") String access_token);

    /**
     * 获取售后列表
     */
    @GET("serviceforms")
    Observable<BaseEntity<RxTaskListBean>> getTaskList(@Query("access_token") String access_token, @Query("searchText") String searchText, @Query("size") int size, @Query("current") int current);

    /**
     * 售后详情
     */
    @GET("serviceform/{fid}")
    Observable<BaseEntity<RxTaskDetail>> taskDetail(@Path("fid") String fid, @Query("access_token") String access_token);

    /**
     * 客户确认
     */
    @Multipart
    @POST("serviceform/confirm")
    Observable<BaseEntity<Boolean>> confirm(@Part("sign") RequestBody description, @Part MultipartBody.Part file);

    /**
     * 版本更新
     */
    @GET("android/person/{buildId}")
    Observable<BaseEntity<RxUpdate>> updateVersion(@Path("buildId") int buildId, @Query("access_token") String access_token);

    @Streaming
    @GET
    Observable<ResponseBody> downloadFile(@Url String fileUrl);


    /********************************************新版API*****************************************/

    /**
     * 获取企业及角色功能列表
     */
    @GET("einfos")
    Observable<BaseArrayEntity<RxEinfos>> einfos(@Query("access_token") String access_token);

    /**
     * 提交反馈
     */
    @Headers({"Content-Type: text/plain", "Accept: application/json"})//需要添加头
    @POST("feedback")
    Observable<BaseEntity<String>> feedback(@Query("access_token") String access_token, @Body RequestBody text);

    /**
     * 获取服务站列表
     */
    @GET("estations")
    Observable<BaseArrayEntity<RxEstion>> estations(@Query("access_token") String access_token);

    /**
     * 获取企业车辆列表
     * key=车牌号或车架号模糊查询
     * current=1
     * size=10
     * status=2 默认查询出售车辆(入库=1 出库2   0入库+出库)
     * start_at:yyyy-mm-dd  开始时间(字符类型)
     * end_at:yyyy-mm-dd  结束时间(字符类型)
     * typeId:车型id
     * 车辆查询接口中加入一个report参数字段 report=1 表示数据未上报的车辆，report=2表示数据已上报的车辆 默认是report=0 表示查询所有车辆
     */
    @GET("vehicles")
    Observable<BaseEntity<RxVehicle>> vehicles(@Query("access_token") String access_token, @Query("e") String e, @Query("r") String r, @Query("current") int current, @Query("status") int status, @Query("key") String key, @Query("size") int size, @Query("report") int report, @Query("typeId") String typeId, @Query("start_at") String start_at, @Query("end_at") String end_at);

    /**
     * 获取企业的车型列表
     * GET:/vehicle/types?access_token=access_key&e=eCode&r=roleCode
     */
    @GET("vehicle/types")
    Observable<BaseArrayEntity<RxVehiclesType>> vehiclesTypes(@Query("access_token") String access_token, @Query("e") String e, @Query("r") String r);

    /**
     * 5新增或更新车辆信息(此处在新增车辆时先查询车型列表用于获取车型ID)
     * POST:vehicle/storage?access_token=access_key&e=eCode&r=roleCode
     */
    @Headers({"Content-Type: application/json", "Accept: application/json"})
    @POST("vehicle/storage")
    Observable<BaseEntity<Object>> storage(@Query("access_token") String access_token, @Query("e") String e, @Query("r") String r, @Body RequestBody text);

    /**
     * 车辆详情
     * GET: /vehicle/{车辆ID}}?access_token=access_key&e=eCode&r=roleCode
     * 注意：入库状态时 不显示经销商和客户信息模块
     */
    @GET("vehicle/{id}")
    Observable<BaseEntity<RxVehicleDetail>> vehiclesDetail(@Path("id") String id, @Query("access_token") String access_token, @Query("e") String e, @Query("r") String r);

    /**
     * 车辆出库
     * PUT:vehicle/{车辆ID}/sale?access_token=access_key&e=eCode&r=roleCode
     */
    @Headers({"Content-Type: application/json", "Accept: application/json"})
    @PUT("vehicle/{id}/sale")
    Observable<BaseEntity<Object>> sale(@Path("id") String id, @Query("access_token") String access_token, @Query("e") String e, @Query("r") String r, @Body RequestBody text);

    /**
     * .获取企业的数据已上报入库状态车辆
     * GET:/vehicle/storage?access_token=access_key&e=eCode&r=roleCode
     */
    @GET("vehicle/storage")
    Observable<BaseEntity<RxStorageCar>> getStorage(@Query("access_token") String access_token, @Query("e") String e, @Query("r") String r, @Query("size") int size, @Query("current") int current);


    /**
     * 获取企业的自动化诊断的车辆列表
     * GET:/diagnose/vehicles?access_token=access_key&e=eCode&r=rocleCode
     * 请求参数：
     * searchText=VIN|PN模糊查询
     * current=1
     * size=10
     * typeId=车型ID 可不用
     */

    @GET("diagnose/vehicles")
    Observable<BaseEntity<RxDiagnosisListItem>> getDiagnoseList(@Query("access_token") String access_token, @Query("e") String e, @Query("r") String r, @Query("size") int size, @Query("current") int current, @Query("searchText") String searchText);


    /**
     * 自动化诊断详情
     * GET:/diagnose/{vin}?access_token=access_key&e=eCode&r=rocleCode
     */
    @GET("diagnose/{vin}")
    Observable<BaseEntity<RxDiagnosisAlarm>> alarmsDetail(@Path("vin") String vin, @Query("access_token") String access_token, @Query("collectTime") String collectTime, @Query("e") String e, @Query("r") String r);

    /**
     * 根据VIN获取车辆的诊断报告-图表数据
     * //diagnose/details/{vin}?access_token=access_key&e=eCode&r=rocleCode
     */
    @GET("diagnose/details/{vin}")
    Observable<BaseArrayEntity<RxDiagnosisChart>> alarmsChartDetail(@Path("vin") String vin, @Query("access_token") String access_token, @Query("collectTime") String collectTime, @Query("e") String e, @Query("r") String r);


    /**
     * 获取员工列表
     */
    @GET("eusers")
    Observable<BaseEntity<RxEusers>> eusers(@Query("access_token") String access_token, @Query("e") String e, @Query("r") String r, @Query("current") int current, @Query("size") int size, @Query("key") String key);

    /**
     * 通过账号查找到用户信息
     */
    @GET("find/user")
    Observable<BaseEntity<RxFindUser>> findUser(@Query("access_token") String access_token, @Query("e") String e, @Query("r") String r, @Query("account") String account);

    /**
     * 获取该业务下面所有的角色功能列表
     */
    @GET("busroles/fn")
    Observable<BaseArrayEntity<RxFn>> fn(@Query("access_token") String access_token, @Query("e") String e, @Query("r") String r);

    /**
     * 邀请用户接口
     */
    @Headers({"Content-Type: application/json", "Accept: application/json"})
    @POST("ask/euser")
    Observable<BaseEntity<Object>> askUser(@Query("access_token") String access_token, @Query("e") String e, @Query("r") String r, @Body RequestBody body);

    /**
     * *
     * 移除员工
     */
    @DELETE("euser/{id}")
    Observable<BaseEntity<Object>> removeStaff(@Path("id") String id, @Query("access_token") String access_token, @Query("e") String e, @Query("r") String r);

    /**
     * 修改员工信息员工
     */
    @Headers({"Content-Type: application/json", "Accept: application/json"})
    @PUT("euser/{id}")
    Observable<BaseEntity<Object>> editStaff(@Path("id") String id, @Query("access_token") String access_token, @Query("e") String e, @Query("r") String r, @Body RequestBody body);

    /**
     * /api/2.0/fault?access_token=access_key
     * 上报故障
     */
    @POST("fault")
    Observable<BaseEntity<Object>> fault(@Query("access_token") String access_token, @Body RequestBody body);

    /**
     * /api/2.0/fault?access_token=access_key
     * 上报故障
     */
    @GET("fault")
    Observable<BaseArrayEntity<FailureBeen>> fault(@Query("access_token") String access_token);

    /**
     * 获取支付宝信息
     */
    @FormUrlEncoded
    @POST("recharge/alipay/orderpay")
    Observable<BaseEntity<String>> getAliOrderpay(@Field("sign") String sign);


    /**
     * 获取微信支付信息
     */
    @FormUrlEncoded
    @POST("recharge/wechatPay/unifiedorder")
    Observable<BaseEntity<WXPayBean>> getWXOrderpay(@Field("sign") String sign);

    /**
     * /api/2.0/fault
     * 消费记录
     */
    @GET("orders")
    Observable<BaseEntity<RxOrder>> orders(@Query("access_token") String access_token, @Query("current") int current, @Query("size") int size);

    /**
     * /api/2.0/points
     * 积分记录
     */
    @GET("points")
    Observable<BaseEntity<PointsBean>> points(@Query("access_token") String access_token, @Query("current") int current, @Query("size") int size);

    /**
     * /api/2.0/account
     * 积分记录
     */
    @GET("account")
    Observable<BaseEntity<AccountBean>> account(@Query("access_token") String access_token);


    /**
     * /api/2.0/account
     * 积分记录
     */
    @GET("vehicle_realtime?start_time=2018-03-30 00:00:00&end_time=2018-03-30 23:59:59&vin=LGHF9CRH6EJ001731")
    Observable<BaseEntity<AccountBean>> trajectory();

}